<?php
// +----------------------------------------------------------------------
// | Class  Helper 系统基础方法
// +----------------------------------------------------------------------
// | Copyright (c) 2020
// +----------------------------------------------------------------------

// 获取php版本
function SYS_PHP_VERSION(){
    $v = substr(PHP_VERSION, 0, 3);
    if($v < '5.3'){
        exit("PHP版本过低，必须5.3及以上");
    }
    // 重置时区_性能高于ini_set('date.timezone', 'PRC');
    date_default_timezone_set('PRC');
    return $v;
}

// 获取http还是https
function SYS_HTTP_TYPE(){
    if(isset($_SERVER['SERVER_PORT'])){
        if($_SERVER['SERVER_PORT'] == '443'){
            return 'https://';
        }
    }
    if(isset($_SERVER['HTTPS'])){
        if($_SERVER['HTTPS'] == 'on'){
            return 'https://';
        }
    }
    if(isset($_SERVER['HTTP_X_FORWARDED_PROTO'])){
        if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
            return 'https://';
        }
    }
    return 'http://';
}

// 获取项目完整域名
function SYS_HOST($HTTP_TYPE, $HTTP_HOST){
    $WWW_URL = $HTTP_TYPE.$HTTP_HOST.dirname($_SERVER['PHP_SELF']);
    $WWW_URL = strtr($WWW_URL,"\\","/");
    $WWW_URL = rtrim($WWW_URL, '/'); // 去掉后边的斜杠(不确定是否有斜杠有则去掉)
    return $WWW_URL.'/';
}

// 当前访问的URL
function SYS_WEB_URL($HTTP_TYPE, $HTTP_HOST){
    $WEB_URL = $HTTP_TYPE.$HTTP_HOST.$_SERVER['REQUEST_URI'];   // 获取完整url
    if(SYS_URL_BOGUS){                                          // 开启伪静态时验证连接
        if(strpos($WEB_URL, SYS_URL_FIX) === false){    // 没后缀
            if(SYS_HOST != $WEB_URL ){                          // 判断不是主页
                $WEB_URL = $WEB_URL.SYS_URL_FIX;                // 当前连接拼接url后缀
                /*if($_SERVER['REQUEST_METHOD'] != 'POST'){       // 数据提交类型不是post
                    header("Location: $WEB_URL");        // 重定向
                }*/
            }
        }
    }
    return $WEB_URL;
}

// URL字符串
function SYS_URL_STR(){
    // 参数串
    $URL_PARAM = SYS_URL_PARAM_FIX != '/' ? SYS_URL_PARAM_FIX : '';
    // 有后缀
    if(SYS_URL_FIX){
        if(strpos($URL_PARAM,SYS_URL_FIX) !== false){
            // 参数串去除后缀
            $URL_PARAM = substr($URL_PARAM, 0, -strlen(SYS_URL_FIX));
        }
    }
    return $URL_PARAM;
}

// URL参数重置
function SYS_URL_PARAM($URL_PARAM_ARR){
    // 获取URL参数键值混合数组
    if(!empty($URL_PARAM_ARR)){
        // 为安全初始化参数
        $_GET = $_REQUEST = array();
        // 匹配参数键值对
        foreach($URL_PARAM_ARR as $k=>$v){
            if($k%2 == 0){
                $_GET[$v] = isset($URL_PARAM_ARR[$k+1]) ? $URL_PARAM_ARR[$k+1] : '';
                $_REQUEST[$v] = isset($URL_PARAM_ARR[$k+1]) ? $URL_PARAM_ARR[$k+1] : '';
            }
        }
    }
    // 删除默认参数
    /*if(isset($_GET['zhlphpurl'])){
        unset($_GET['zhlphpurl']);
        unset($_REQUEST['zhlphpurl']);
    }*/
}

// URL裁剪
function SYS_URL_CUT(){
    $appMould = SYS_APP_DEFAULT; // 默认模块
    $URL_PARAM_ARR = explode("/", SYS_URL_STR());   // url参数数组
    $mouldArr = explode("_", $URL_PARAM_ARR[0]);    // 模块、类、方法数组
    // 访问中有指定的模块和方法时
    if(isset($mouldArr[1])){
        // 指定的控制器文件存在
        if(!is_file(SYS_PATH.SYS_APP_PATH.'/'.SYS_APP_DEFAULT.'/controllers/'.ucfirst($appMould).'_'.ucfirst($mouldArr[0]).'Controller'.SYS_WILL_FIX)) {
            $appMould = $mouldArr[0];
            array_shift($mouldArr);
        }
    }
    // 没有则默认index控制器
    $mouldArr[0] = $mouldArr[0] ? $mouldArr[0] : 'index';
    // 获取控制器(完整控制器名)
    $controller = ucfirst($appMould).'_'.ucfirst($mouldArr[0]);
    // 获取方法名
    $action = isset($mouldArr[1]) && $mouldArr[1] ? $mouldArr[1] : 'index';

    // 删除模块方法，剩下的为参数
    array_shift($URL_PARAM_ARR);
    SYS_URL_PARAM($URL_PARAM_ARR);
    return array('controller'=>$controller, 'action'=>$action, 'mould'=>$appMould);
}

/**
 * 设置sessions
 */
function SYS_SESSIONS_SET($name, $val){
    if(isset($_SESSION[$name])){
        $_SESSION[$name] = $val;
        session_commit(); //别名session_write_close();
        return true;
    }
    if(SYS_PHP_VERSION >= '5.4'){
        if(!session_status() != 2){
            session_start();
        }
    }else{
        error_reporting(0);
        @session_start();
    }
    $_SESSION[$name] = $val;
    session_commit(); //别名session_write_close();
}

/**
 * 获取sessions
 */
function SYS_SESSIONS_GET($name){
    if(isset($_SESSION[$name])){
        return $_SESSION[$name];
    }
    if(SYS_PHP_VERSION >= '5.4'){
        if(session_status() != 2){
            session_start();
        }
    }else{
        error_reporting(0);
        @session_start();
    }
    $info = isset($_SESSION[$name]) ? $_SESSION[$name] : null;
    session_commit();
    return $info;
}

/**
 * 删除sessions
 */
function SYS_SESSIONS_DEL($name){
    if(isset($_SESSION[$name])){
        unset($_SESSION[$name]);
        if(isset($_COOKIE[session_name($name)])){
            setcookie(session_name($name),'',time()-3600, '/');
        }
        session_commit();
        return true;
    }
    if(SYS_PHP_VERSION >= '5.4'){
        if(session_status() != 2){
            session_start();
        }
    }else{
        error_reporting(0);
        @session_start();
    }
    if(!isset($_SESSION[$name])){
        return false;
    }
    unset($_SESSION[$name]);
    if(isset($_COOKIE[session_name($name)])){
        setcookie(session_name($name),'',time()-3600, '/');
    }
    session_commit();
    return true;
}

/**
 * 清空所有session
 */
function SYS_SESSIONS_CLEAR($name=''){
    if(!isset($_SESSION)){
        if(SYS_PHP_VERSION >= '5.4'){
            if(!session_status() != 2){
                session_start();
            }
        }else{
            error_reporting(0);
            @session_start();
        }
    }
    @$_SESSION = array(); // 删除所有 Session 变量
    //判断 cookie 中是否保存 Session ID 存在清理cookie
    if(isset($_COOKIE[session_name()])){
        setcookie(session_name(),'',time()-3600, '/');
    }
    session_destroy(); //删除当前用户对应的session文件以及释放session id，内存中的$_SESSION变量内容依然保留
    return true;
}

/**
 * 设置cookie
 */
function SYS_COOKIES_SET($name, $val, $expire = 604800){ // 默认7天
    $expire += time();
    //ob_start();
    setcookie($name, $val, $expire, '/');
    //ob_end_flush();
    //$_COOKIE[$name] = $val;
}

/**
 * 获取cookie
 */
function SYS_COOKIES_GET($name){
    if(isset($_COOKIE[$name])){
        return $_COOKIE[$name];
    }
    return null;
}

/**
 * 删除cookie
 */
function SYS_COOKIES_DEL($name){
    setcookie($name, 'null', time() - 1000, '/');
}

/**
 * 运行开销统计
 */
function SYS_COSTS(){
    return array(
        'times'=>round((microtime(true) - SYS_INIT_TIME), 3),
        'ram'=>round((memory_get_usage() - SYS_INIT_MEMORY) / 1024, 2)
    );
}

/**
 * 重定向
 */
function SYS_REDIRECT($url){
    if($url){
        if(stripos($url,'http://') == false && stripos($url,'https://') == false){
            $url = SYS_HOST.$url.SYS_URL_FIX;
        }
    }else{
        $url = SYS_HOST;
    }
    header("Location: ".$url);exit;
}

/**
 * js提示跳转
 */
function SYS_JUMP($txt = '提示', $url = ''){
    $txt = strval($txt);
    if($url){
        $httpType = '';
        if(strpos($url,'http://') !== false){
            $httpType = 'http://';
        }else if(strpos($url,'https://') !== false){
            $httpType = 'https://';
        }
        $url = $httpType ? $url : SYS_HOST.$url;
        echo "<script>alert('".$txt."');window.location.href='".$url."';</script>";
    }else{
        echo "<script>alert('".$txt."');window.history.go(-1);</script>";
    }
}

/**
 * 路由拼接
 */
function SYS_URL_PATH($url){
    return SYS_HOST.$url.SYS_URL_FIX;
}

/**
 * 模版内加载模版路径辅助函数
 */
function SYS_TMPL($tmpl){
    return SYS_VIEW_PATH.$tmpl.SYS_TMPL_FIX;
}

/**
 * 系统日志
 */
function SYS_ERR_LOGER($str, $file='', $line=0){
    $debug = array();
    $errArr = debug_backtrace();
    if($errArr){
        foreach($errArr as $v){
            $file = isset($v['file']) ? 'ErrFile in '.$v['file'] : '';
            $line = isset($v['line']) ? ' on line '.$v['line'] : '';
            $class = isset($v['class']) ? ' & Class is '.$v['class'] : '';
            $function = isset($v['function']) ? ' and Function is '.$v['function'] : '';
            $debug[] = $file.$line.$class.$function;
        }
    }
    $file = $file ? ' in '.$file : '';
    $line = $line ? ' on line '.$line : '';
    $str = $str.$file.$line;
    if($str){
        array_unshift($debug, $str);
    }
    if(SYS_DEBUG_LOG){
        is_array($str) && $str = print_r($str,true);
        is_object($str) && $str = print_r($str,true);
        $errorStr = '[' . date('Y-m-d H:i:s') . '][LOG] '.$str . PHP_EOL;
        error_log($errorStr, 3, SYS_DEBUG_LOG_PATH . 'SYS' .date('Y_m_d') . '.log', 'extra');
    }
    if(SYS_PAGE404){
        header("Location: ".SYS_HOST."404.html");
    }else if(SYS_DEBUG){
        SYS_LOGERR($debug);
    }
    exit;
}

/**
 * sql日志db
 */
function SYS_DB_LOGER($str){
    if(!SYS_DB_LOG){
        return '';
    }
    // 日志目录创建
    if(!file_exists(SYS_DB_LOG_PATH)){
        SYS_ADD_PATH(SYS_DB_LOG_PATH);
    }
    is_array($str) && $str = print_r($str,true); //print_r 增加 true 返回打印字符窜
    is_object($str) && $str = print_r($str,true);
    $errorStr = '[' . date('Y-m-d H:i:s') . '][LOG] '.$str . PHP_EOL;
    error_log($errorStr, 3, SYS_DB_LOG_PATH . 'DB' .date('Y_m_d') . '.log', 'extra');
}

/**
 * 程序日志 print_r
 */
function SYS_LOGERR($s){
    echo '<pre>';
    print_r($s);
    echo '</pre>';
    exit;
}

/**
 * 程序日志 var_dump
 */
function SYS_LOGERD($s){
    echo '<pre>';
    var_dump($s);
    echo '</pre>';
    exit;
}

/**
 * 程序日志
 */
function SYS_LOGER($str){
    if(!SYS_RUN_LOG){
        return '';
    }
    // 日志目录创建
    if(!file_exists(SYS_RUN_LOG_PATH)){
        SYS_ADD_PATH(SYS_RUN_LOG_PATH);
    }
    is_array($str) && $str = print_r($str,true); //print_r 增加 true 返回打印字符窜
    is_object($str) && $str = print_r($str,true);
    $errorStr = '[' . date('Y-m-d H:i:s') . '][LOG] '.$str . PHP_EOL;
    error_log($errorStr, 3, SYS_RUN_LOG_PATH . 'LOG' .date('Y_m_d') . '.log', 'extra');
}

/**
 * Notes: 字符串-加密
 * Desc: 兼容字符串特殊字符
 */
function SYS_ENCRYPT($string, $key, $method = '0')
{
    if(is_numeric($method)){
        $methods = openssl_get_cipher_methods();
        $method = $methods[$method];
    }
    $ivlen = openssl_cipher_iv_length($method);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $string = openssl_encrypt($string, $method, $key, true, $iv); // OPENSSL_RAW_DATA
    $string = base64_encode($iv.$string);
    return rtrim(strtr($string, '+/', '-_'), '=');
}

/**
 * Notes: 字符串-解密
 * Desc: 兼容字符串特殊字符
 */
function SYS_DECRYPT($string, $key, $method = '0')
{
    if(is_numeric($method)){
        $methods = openssl_get_cipher_methods();
        $method = $methods[$method];
    }
    $string = str_pad(strtr($string, '-_', '+/'), strlen($string) % 4, '=', STR_PAD_RIGHT);
    $string = base64_decode($string);
    $ivlen = openssl_cipher_iv_length($method);
    $iv = substr($string, 0, $ivlen);
    $string = substr($string, $ivlen);
    $string = openssl_decrypt($string, $method, $key, true, $iv);
    return $string;
}

/**
 * Notes: 客户端操作限制
 * User: ZHL
 * Date: 2020/5/5
 */
function SYS_COOKIES_COUNT($kname, $kcount){
    $limitFlag = SYS_COOKIES_GET($kname);
    if (!$limitFlag) {
        $counts = base64_encode(base64_encode(1));
        SYS_COOKIES_SET($kname, $counts,86400);
    } else {
        $counts = intval(base64_decode(base64_decode($limitFlag)));
        if ($counts >= $kcount) {
            return false;
        }
        $counts = base64_encode(base64_encode($counts + 1));
        SYS_COOKIES_SET($kname, $counts,86400);
    }
    return true;
}

/**
 * Notes: 循环创建目录
 * User: ZhuHaili
 */
/*
function SYS_ADD_PATH($path){
    if (!file_exists($path)){
        SYS_ADD_PATH(dirname($path));
        mkdir($path, 0777);
    }
}
*/

/**
 * Notes: 循环创建目录
 * User: ZhuHaili
 */
function SYS_ADD_PATH($path){
    if(!$path){
        return '';
    }
    if(is_dir($path)){
        return $path;
    }
    try{
        mkdir($path, 0777, true);
        return $path;
    }catch (Exception $e){
        SYS_ERR_LOGER($e->getMessage(), __FUNCTION__, __LINE__);
        return '';
    }
}

/**
 * Notes: 创建文件
 * User: ZhuHaili
 */
function SYS_ADD_FILE($path, $data = ''){
    if(!$path){
        return '';
    }
    if (is_file($path)){
        return $path;
    }
    try{
        file_put_contents($path, $data);
        return $path;
    }catch (Exception $e){
        SYS_ERR_LOGER($e->getMessage(), __FUNCTION__, __LINE__);
        return '';
    }
}